Function.prototype._call = function (ctx, ...params) {
  // 1. 参数校验
  // 1.1 ctx 如果不传或传null/undefined，在非严格模式下为window
  ctx == null ? (ctx = window) : null;
  const ctxType = typeof ctx;
  // 1.2 如果 ctx 不是对象，将其转换成对象
  ctxType !== "object" || ctxType !== "function" ? (ctx = Object(ctx)) : null;

  // 2. 把函数实例fn作为 ctx 的方法，使得fn中的this可以指向ctx
  var self = this,
    key = Symbol(),
    res = null;
  ctx[key] = self;
  res = ctx[key](...params);

  // 3. 处理完毕后，清除 key
  delete ctx[key];
  return res;
};
console.log('this指向window', sayHello(17))
console.log('通过call使得this指向window', sayHello.call(person, 18))
console.log('通过_call使得this指向windo', sayHello.call(person, 19))
